home *** CD-ROM | disk | FTP | other *** search
- package com.extensibility.xml;
-
- import com.extensibility.util.Debug;
- import com.extensibility.util.StringUtilities;
- import com.extensibility.xml.dt.DataType;
- import com.extensibility.xml.dt.DataTypeFactory;
- import java.io.IOException;
- import java.io.Reader;
- import java.util.Hashtable;
- import java.util.Stack;
- import java.util.Vector;
- import org.xml.sax.AttributeList;
- import org.xml.sax.HandlerBase;
- import org.xml.sax.InputSource;
- import org.xml.sax.Locator;
- import org.xml.sax.Parser;
- import org.xml.sax.SAXException;
- import org.xml.sax.SAXParseException;
- import org.xml.sax.helpers.LocatorImpl;
-
- public final class DCDReader extends HandlerBase {
- static final String TOPLEVEL_ELEMTYPE = "ElementDef";
- static final String TOPLEVEL_ATTRTYPE = "AttributeDef";
- static final String TOPLEVEL_NAMESPACE = "Namespace";
- static final String TAG_ELEMENT = "Element";
- static final String TAG_ATTRIBUTE = "Attribute";
- static final String TAG_ATTR_VALUES = "Values";
- static final String TAG_GROUP = "Group";
- static final String TAG_COMMENT = "Description";
- static final String TAG_INTERNAL_ENTITY = "InternalEntityDef";
- static final String TAG_EXTERNAL_ENTITY = "ExternalEntityDef";
- private Hashtable elemDecls;
- private Hashtable currentAttrs;
- private ElementDeclaration currentElemDecl;
- private Vector elemDeclAttrs;
- private Hashtable namespaces;
- private AttributeDeclaration currentAttrDecl;
- private SchemaIntf schema;
- private ContentModel currentCM;
- private boolean cmClosed;
- private Stack cmConnectors;
- private Stack contentModels;
- private Object commentKind;
- private String commentContent;
- private boolean commentStart;
- private String entityName;
- private String entityValue;
- private boolean internalGEStart;
- private boolean elemStart;
- private String elemRefName;
- private boolean enumStart;
- private String attrConstraints;
- private boolean attrStart;
- private String attrName;
- private boolean nsStart;
- private String nsUri;
- private boolean isFirstGroup;
- private boolean inProlog = true;
- private Locator locator;
-
- public DCDReader(SchemaIntf var1) {
- this.schema = var1;
- }
-
- public void error(String var1, int var2, int var3, int var4) {
- ParserException var5 = new ParserException(var2, var1);
- var5.setSource(String.valueOf(String.valueOf(String.valueOf(String.valueOf("See Line: ").concat(String.valueOf(var3))).concat(String.valueOf(" Column:"))).concat(String.valueOf(var4))).concat(String.valueOf(" in file.")));
- var5.setSourceLinePos(var3);
- this.schema.addError(var5);
- }
-
- public void error(SAXParseException var1) {
- this.error(((SAXException)var1).getMessage(), 240, this.locator.getLineNumber(), this.locator.getColumnNumber());
- }
-
- public void fatalError(SAXParseException var1) {
- this.error(var1);
- }
-
- public void setDocumentLocator(Locator var1) {
- this.locator = var1;
- }
-
- public void parse(URI var1) throws IOException {
- Reader var3 = null;
-
- try {
- Parser var2 = SchemaUtilities.getParser();
- this.setDocumentLocator(new LocatorImpl());
- var2.setEntityResolver(this);
- var2.setErrorHandler(this);
- var2.setDocumentHandler(this);
- var3 = var1.createReader();
- var2.parse(new InputSource(var3));
- } catch (IOException var15) {
- throw var15;
- } catch (Exception var16) {
- if (!(var16 instanceof IOException)) {
- }
- } finally {
- try {
- if (var3 != null) {
- var3.close();
- }
- } catch (IOException var14) {
- }
-
- }
-
- }
-
- public void startDocument() {
- this.elemDecls = new Hashtable();
- this.currentAttrs = new Hashtable();
- this.currentElemDecl = null;
- this.elemDeclAttrs = new Vector();
- this.namespaces = new Hashtable();
- this.currentAttrDecl = null;
- this.cmClosed = false;
- this.cmConnectors = new Stack();
- this.contentModels = new Stack();
- this.commentKind = null;
- this.commentContent = null;
- this.commentStart = false;
- this.entityName = null;
- this.entityValue = null;
- this.internalGEStart = false;
- this.elemStart = false;
- this.elemRefName = null;
- this.enumStart = false;
- this.attrConstraints = null;
- this.attrStart = false;
- this.attrName = null;
- this.nsStart = false;
- this.nsUri = null;
- this.isFirstGroup = false;
- }
-
- public void endDocument() {
- }
-
- public void processingInstruction(String var1, String var2) throws SAXException {
- ProcessingInstruction var3 = new ProcessingInstruction(var1, var2);
- if (this.inProlog) {
- ((BaseDeclaration)var3).setIsInProlog(true);
- }
-
- this.schema.insertDeclaration(var3, (BaseDeclaration)null);
- }
-
- public void startElement(String var1, AttributeList var2) {
- this.inProlog = false;
- this.parseElement(var1, var2);
- }
-
- public void parseElement(String var1, AttributeList var2) {
- if (!var1.equals("DCD")) {
- if (var1.equals("ElementDef")) {
- String var3 = var2.getValue("Type");
- String var4 = var2.getValue("Model");
- String var5 = var2.getValue("Content");
- String var6 = var2.getValue("Datatype");
- String var7 = var2.getValue("Fixed");
- if (var4 == null) {
- var4 = new String("data");
- }
-
- if (this.elemDecls.containsKey(var3)) {
- this.currentElemDecl = (ElementDeclaration)this.elemDecls.get(var3);
- } else {
- this.currentElemDecl = new ElementDeclaration(var3, 3);
- this.elemDecls.put(var3, this.currentElemDecl);
- }
-
- for(int var8 = 0; var8 < var2.getLength(); ++var8) {
- String var9 = var2.getName(var8);
- if (var9.indexOf(":") != -1 && !var9.equals("RDF:Order")) {
- String var10 = var2.getValue(var8);
- this.currentElemDecl.putMetaProp(var9, var10);
- }
- }
-
- this.currentCM = this.currentElemDecl.getContentModel();
- if (((String)var4).equals("Empty")) {
- this.currentCM.setContentModel(3);
- this.cmClosed = true;
- } else if (((String)var4).equals("Data")) {
- this.currentCM.setContentModel(5);
- if (var6 != null) {
- this.currentElemDecl.setDataType(DataTypeFactory.createDataType(var6));
- }
-
- this.cmClosed = true;
- } else if (((String)var4).equals("Any")) {
- this.currentCM.setContentModel(2);
- } else {
- if (((String)var4).equals("Elements")) {
- this.currentCM.setContentModel(6);
- } else if (((String)var4).equals("Mixed")) {
- this.currentCM.setContentModel(4);
- }
-
- this.isFirstGroup = true;
- this.contentModels.push(this.currentCM.getRootGroup());
- }
- } else if (var1.equals("AttributeDef")) {
- String var16 = var2.getValue("Name");
- String var20 = var2.getValue("Global");
- String var24 = var2.getValue("Datatype");
- String var28 = var2.getValue("Occurs");
- String var30 = var2.getValue("ID-Role");
- String var31 = var2.getValue("Default");
- String var32 = var2.getValue("Fixed");
- DataType var33 = null;
- if (var24 != null) {
- if (var24.equals("enumeration")) {
- var33 = DataTypeFactory.createDataType(10);
- } else {
- var33 = DataTypeFactory.createDataType(var24.toUpperCase());
- }
- } else if (var30 != null) {
- if (!var30.equals("ID") && !var30.equals("IDREF") && !var30.equals("IDREFS")) {
- this.error(var30, 239, this.locator.getLineNumber(), this.locator.getColumnNumber());
- } else {
- var33 = DataTypeFactory.createDataType(var30);
- }
- } else {
- var33 = DataTypeFactory.createDataType(1);
- }
-
- boolean var11 = false;
- if (var28 != null && var28.equals("Required")) {
- var11 = true;
- } else if (var32 != null) {
- var11 = true;
- }
-
- AttributeDeclaration var12 = new AttributeDeclaration(this.currentElemDecl, var16, var33, (Vector)null, var11, var31);
- if (var20 != null && var20.equals("True")) {
- this.currentAttrs.put(var16, var12);
- } else {
- this.elemDeclAttrs.addElement(var12);
- }
-
- for(int var13 = 0; var13 < var2.getLength(); ++var13) {
- String var14 = var2.getName(var13);
- if (var14.indexOf(":") != -1 && !var14.equals("RDF:Order")) {
- String var15 = var2.getValue(var13);
- ((BaseDeclaration)var12).putMetaProp(var14, var15);
- }
- }
-
- this.currentAttrDecl = var12;
- } else if (var1.equals("Namespace")) {
- this.nsStart = true;
- } else if (var1.equals("Values")) {
- this.enumStart = true;
- } else if (var1.equals("Attribute")) {
- this.attrStart = true;
- } else if (var1.equals("Group")) {
- Debug.assert(!this.cmClosed, String.valueOf(this.currentElemDecl.getName()).concat(String.valueOf(" shouldn't have any content terms")));
- String var17 = var2.getValue("Occurs");
- String var21 = var2.getValue("RDF:Order");
- if (var21 == null) {
- var21 = "Seq";
- }
-
- if (this.isFirstGroup) {
- this.cmConnectors.push(this.getConnector(var21));
- this.isFirstGroup = false;
- } else {
- ContentModelTerm var25 = new ContentModelTerm();
- var25.setOccurance(this.getOccurance(var17));
- var25.setConnection(this.getCurrentConnection());
- this.getCurrentParent().addTerm(var25);
- this.contentModels.push(var25);
- this.cmConnectors.push(this.getConnector(var21));
- }
- } else if (var1.equals("Element")) {
- Debug.assert(!this.cmClosed, String.valueOf(this.currentElemDecl.getName()).concat(String.valueOf(" shouldn't have any content terms")));
- this.elemStart = true;
- } else if (var1.equals("Description")) {
- this.commentStart = true;
- } else if (var1.equals("ExternalEntityDef")) {
- this.entityName = var2.getValue("Name");
- String var18 = var2.getValue("SystemID");
- String var22 = var2.getValue("PublicID");
- URI var26 = new URI((URI)null, var18);
- ExternalGEDeclaration var29 = new ExternalGEDeclaration(this.entityName, var22, var26);
- this.schema.insertDeclaration(var29, (BaseDeclaration)null);
- } else if (var1.equals("InternalEntityDef")) {
- String var19 = var2.getValue("Name");
- String var23 = var2.getValue("Value");
- InternalGEDeclaration var27 = new InternalGEDeclaration(var19, var23);
- this.schema.insertDeclaration(var27, (BaseDeclaration)null);
- } else {
- this.error(var1, 239, this.locator.getLineNumber(), this.locator.getColumnNumber());
- }
- }
-
- }
-
- private char getCurrentConnection() {
- return (Character)this.cmConnectors.peek();
- }
-
- private ContentModelTerm getCurrentParent() {
- return (ContentModelTerm)this.contentModels.peek();
- }
-
- public void endElement(String var1) {
- if (var1.equals("ElementDef")) {
- this.schema.insertDeclaration(this.currentElemDecl, (BaseDeclaration)null);
- this.currentElemDecl = null;
-
- for(int var2 = 0; var2 < this.elemDeclAttrs.size(); ++var2) {
- AttributeDeclaration var3 = (AttributeDeclaration)this.elemDeclAttrs.elementAt(var2);
- this.schema.insertDeclaration(var3, (BaseDeclaration)null);
- }
-
- this.elemDeclAttrs.removeAllElements();
- if (!this.contentModels.empty()) {
- this.contentModels.removeAllElements();
- }
-
- if (!this.cmConnectors.empty()) {
- this.cmConnectors.removeAllElements();
- }
-
- this.cmClosed = false;
- } else if (var1.equals("Group")) {
- if (this.cmConnectors.size() > 1) {
- this.cmConnectors.pop();
- }
-
- if (this.contentModels.size() > 1) {
- ContentModelTerm var6 = (ContentModelTerm)this.contentModels.pop();
- }
- } else if (var1.equals("Description")) {
- this.commentStart = false;
- if (this.currentAttrDecl != null) {
- this.currentAttrDecl.addComment(new Comment(this.commentContent));
- } else if (this.currentElemDecl != null) {
- this.currentElemDecl.addComment(new Comment(this.commentContent));
- } else {
- Debug.assert(false, "cannot add comment if it doesn't belong to any element declaration");
- }
-
- this.commentKind = null;
- this.commentContent = null;
- } else if (var1.equals("InternalEntityDef") && this.internalGEStart) {
- InternalGEDeclaration var12 = new InternalGEDeclaration(this.entityName, this.entityValue);
- this.schema.insertDeclaration(var12, (BaseDeclaration)null);
- this.internalGEStart = false;
- this.entityName = null;
- this.entityValue = null;
- } else if (var1.equals("Element")) {
- String var7 = new String(this.elemRefName);
- if (this.elemDecls.containsKey(var7)) {
- ElementDeclaration var13 = (ElementDeclaration)this.elemDecls.get(var7);
- } else if (var7.indexOf(":") > 0) {
- String var4 = var7.substring(0, var7.indexOf(":"));
- String var5 = var7.substring(var7.indexOf(":") + 1, var7.length());
- if (!this.namespaces.contains(var4)) {
- this.error(String.valueOf(String.valueOf(var7).concat(String.valueOf(", "))).concat(String.valueOf(var4)), 242, this.locator.getLineNumber(), this.locator.getColumnNumber());
- }
- } else {
- ElementDeclaration var14 = new ElementDeclaration(var7, 3);
- this.elemDecls.put(var7, var14);
- }
-
- char var17 = 0;
- char var18 = this.getCurrentConnection();
- this.getCurrentParent().addTerm(new ContentModelTerm(new TypeRef(var7), var17, var18));
- this.elemStart = false;
- this.elemRefName = null;
- } else if (var1.equals("Values")) {
- Vector var8 = null;
- if (this.attrConstraints != null) {
- var8 = StringUtilities.parseNames(this.attrConstraints);
- }
-
- if (this.currentAttrDecl != null) {
- this.currentAttrDecl.setChoices(var8);
- }
-
- this.attrConstraints = null;
- this.enumStart = false;
- } else if (var1.equals("AttributeDef")) {
- this.currentAttrDecl = null;
- } else if (var1.equals("Attribute")) {
- if (this.currentAttrs.containsKey(this.attrName)) {
- AttributeDeclaration var9 = (AttributeDeclaration)this.currentAttrs.get(this.attrName);
- AttributeDeclaration var15 = (AttributeDeclaration)var9.clone(this.currentElemDecl);
- this.elemDeclAttrs.addElement(var15);
- } else if (this.attrName.indexOf(":") > 0) {
- String var10 = this.attrName.substring(0, this.attrName.indexOf(":"));
- String var16 = this.attrName.substring(this.attrName.indexOf(":") + 1, this.attrName.length());
- if (!this.namespaces.contains(var10)) {
- this.error(String.valueOf(String.valueOf(this.attrName).concat(String.valueOf(", "))).concat(String.valueOf(var10)), 241, this.locator.getLineNumber(), this.locator.getColumnNumber());
- }
- }
-
- this.attrStart = false;
- this.attrName = null;
- } else if (var1.equals("Namespace")) {
- NamespaceDeclaration var11 = new NamespaceDeclaration((String)null, this.nsUri);
- this.schema.insertDeclaration(var11, (BaseDeclaration)null);
- this.nsStart = false;
- this.nsUri = null;
- }
-
- }
-
- public void characters(char[] var1, int var2, int var3) throws SAXException {
- if (this.commentStart) {
- this.commentContent = String.valueOf(var1, var2, var3);
- } else if (this.internalGEStart) {
- this.entityValue = this.entityValue.concat(String.valueOf(var1, var2, var3));
- } else if (this.elemStart) {
- this.elemRefName = String.valueOf(var1, var2, var3);
- } else if (this.enumStart) {
- this.attrConstraints = String.valueOf(var1, var2, var3);
- } else if (this.attrStart) {
- this.attrName = String.valueOf(var1, var2, var3);
- } else if (this.nsStart) {
- this.nsUri = String.valueOf(var1, var2, var3);
- } else {
- String var4 = new String(String.valueOf(var1, var2, var3).trim());
- if (var4.length() > 0) {
- this.error(var4, 239, this.locator.getLineNumber(), this.locator.getColumnNumber());
- }
- }
-
- }
-
- protected char getOccurance(Object var1) {
- char var2 = 0;
- if (var1 != null) {
- if (((String)var1).equals("Required")) {
- var2 = 0;
- } else if (((String)var1).equals("Optional")) {
- var2 = '?';
- } else if (((String)var1).equals("ZeroOrMore")) {
- var2 = '*';
- } else if (((String)var1).equals("OneOrMore")) {
- var2 = '+';
- }
- }
-
- return var2;
- }
-
- protected Character getConnector(Object var1) {
- Character var2 = new Character(',');
- if (((String)var1).equals("Seq")) {
- var2 = new Character(',');
- } else if (((String)var1).equals("Alt")) {
- var2 = new Character('|');
- }
-
- return var2;
- }
- }
-